package org.thread.test06.demo01;

import java.util.LinkedList;

/**
 * 篮子 - 装水果
 *
 * @author ZJL
 * @date 2025-03-14
 */
public class Box {
    /**
     * 篮子容器
     */
    private LinkedList<Fruit> boxList = new LinkedList<>();
    /**
     * 定义常量 - 表达篮子最大容量
     */
    private static final int MAX_SIZE = 5;

    /**
     * 男孩放水果
     *
     * @param name 男孩的姓名
     * @param f    水果名称
     */
    public synchronized void put(String name, Fruit f) {
        //this
        if (boxList.size() == MAX_SIZE) {
            System.out.println("篮子已装满！");
            System.out.println("公主请吃水果...");
            // 通知女孩吃水果
            this.notify();
            try {
                // 男孩停止摘水果
                this.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return;
        }
        boxList.add(f);
        System.out.printf("当前篮子的容量：[%d],[%s]摘得水果是[%s]%n", boxList.size(),name,f);
        try {
            // 睡眠1000毫秒，更好的看效果
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 女孩取水果
     *
     * @param name 女孩的名称
     */
    public synchronized void take(String name) {
        //this
        // 判断篮子空的情况
        if (boxList.isEmpty()) {
            System.out.println("篮子中已没有水果!");
            System.out.println("快去摘水果...");
            // 通知男孩摘水果
            this.notify();
            try {
                // 女孩停止吃水果
                this.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return;
        }
            Fruit fruit = boxList.removeLast();
            System.out.printf("当前篮子的容量：[%d],[%s]吃得水果是[%s]%n", boxList.size(),name,fruit);
        try {
            // 睡眠1000毫秒，更好的看效果
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

}
